package com.octopus.core.scheduler;

import com.octopus.core.Request;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import lombok.NonNull;

/**
 * 默认爬虫调度器。
 *
 * <p>使用内存进行爬虫任务的存储。同时存储已经访问过的下载任务，避免重复执行。
 *
 * @author shoulai.yang@gmail.com
 * @date 2019/07/31
 */
public class DefaultScheduler implements Scheduler {

  /** 任务队列 */
  private BlockingQueue<Request> queue = new LinkedBlockingQueue<Request>();

  /** 已经访问过的下载链接 */
  private Set<String> visited = Collections.synchronizedSet(new HashSet<>());

  public DefaultScheduler() {}

  /**
   * 从已经访问过的下载链接构建此调度器
   *
   * @param visited 已经访问过的下载链接集合
   */
  public DefaultScheduler(@NonNull Collection<String> visited) {
    this.visited.addAll(visited);
  }

  @Override
  public boolean add(Request request) {
    return queue.add(request);
  }

  @Override
  public Request get() {
    return queue.poll();
  }

  @Override
  public int remaining() {
    return queue.size();
  }

  @Override
  public boolean visited(Request request) {
    return this.visited.contains(request.url());
  }

  @Override
  public void visit(Request request) {
    this.visited.add(request.url());
  }
}
